/*
 * Copyright (c) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

const commander = require("commander");
const toolbox_config = require("./toolbox.config");
class ToolBoxCommander {
    program = new commander.Command();
    constructor() { }
    addPluginCommand(plugin) {
        const pluginOption = plugin.pluginOptions;
        if (!pluginOption) {
            return;
        }
        const pluginCommand = this.program.name(pluginOption.name)
            .description(pluginOption.description)
            .version(pluginOption.version)
            .action((opts) => {
                plugin.start(opts);
                plugin.stop();
            });
        pluginOption.commands.forEach((command) => {
            if (command.isRequiredOption) {
                pluginCommand.requiredOption(...command.options);
            } else {
                pluginCommand.option(...command.options);
            }
        });
    }
    buildCommands() {
        this.program.parse();
    }
}
class ToolboxEntry {
    commandBuilder;
    constructor() {
        this.commandBuilder = new ToolBoxCommander();
    }
    runPlugins() {
        const configuration = toolbox_config.getToolConfiguration();
        configuration.plugins.forEach((plugin) => {
            this.commandBuilder.addPluginCommand(plugin);
        });
        this.commandBuilder.buildCommands();
    }
}
function main() {
    const entry = new ToolboxEntry();
    entry.runPlugins();
}
main();
